table of contents
DUP(2) | Руководство программиста Linux | DUP(2) |
ИМЯ¶
dup, dup2 - создать дубликат файлового дескриптора
ОБЗОР¶
#include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd);
ОПИСАНИЕ¶
dup и dup2 создают копию файлового дескриптора oldfd.
Старый и новый дескрипторы можно использовать друг вместо друга. Они имеют общие блокировки, указатель позиции в файле и флаги; например, если позиция в файле была изменена с помощью lseek, на одном из дескрипторов, то эта позиция также меняется и на втором.
Два дескриптора, однако, каждый имеют свой собственный флаг закрыть-при-exec.
dup использует самый маленький свободный номер дескриптора.
dup2 делает newfd копией oldfd, закрывая newfd, если требуется.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
dup и dup2 возвращают новый дескриптор или -1, если произошла ошибка (в этом случае errno устанавливается должным образом).
ОШИБКИ¶
- EBADF
- oldfd не является открытым файловым дескриптором, или же newfd находится вне допустимого диапазона файловых дескрипторов.
- EMFILE
- Процесс уже открыл максимальное количество файлов и пытается открыть еще один.
- EINTR
- Вызов dup2 был прерван каким-либо сигналом.
- EBUSY
- (Только в Linux) Может случиться в dup2 во время при условии состязательных вызовов open() и dup().
ВНИМАНИЕ¶
Ошибка, которую возвращает dup2, отличается от той, что возвращает fcntl(..., F_DUPFD, ...), когда newfd находится вне допустимых пределов. На некоторых системах dup2 также иногда возвращает EINVAL, как F_DUPFD.
ОШИБКИ¶
Если newfd был открыт, любые ошибки, которые могли бы случиться во время close(), теряются. Осторожный программист не будет использовать dup2 не закрыв сперва newfd .
СООТВЕТСТВИЕ СТАНДАРТАМ¶
SVr4, SVID, POSIX, X/OPEN, BSD 4.3. SVr4 документирует дополнительные коды ошибки EINTR и ENOLINK. POSIX.1 добавляет EINTR. Ошибка EBUSY является специфичной для Linux.
СМОТРИ ТАКЖЕ¶
ПЕРЕВОД¶
Copyright (C) Alexey Mahotkin <alexm@hsys.msk.ru> 1999, Виктор Вислобоков <corochoone@perm.ru> 2003
1994-08-21 | Linux 1.1.46 |